package com.example.wan1.data;

import com.example.wan1.constant.Constants;
import com.example.wan1.data.cookie.CookieManager;
import com.example.wan1.utils.AppUtils;
import com.example.wan1.view.login.UserManager;
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

/***
 * 创建时间：2020/2/2 21:52
 * 创建人：10850
 * 功能描述：单例模式：https://www.runoob.com/design-pattern/singleton-pattern.html
 * 返回retrofit的服务
 * 1.有待扩展的点：基本的url
 * 2.cookie的保持
 * 3.关于部分网络请求需要登录，其他的不需要登录这个是怎么区分的？需要研究下
 */
public class RetrofitUtil {

    private volatile static ApiService apiService;

    public static ApiService getInstance() {
        if (apiService == null) {
            synchronized (ApiService.class) {
                if (apiService == null) {
                    createService(Constants.BASE_URL);
                }
            }
        }
        return apiService;
    }

    private static void createService(String url) {
        /*//这里需要判断是不是已经登录了，如果是已经登录了，那么带上cookie管理一起请求数据
        OkHttpClient.Builder okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)//设置超时时间
                .readTimeout(10, TimeUnit.SECONDS)//设置读取超时时间
                .writeTimeout(10, TimeUnit.SECONDS)//设置写入超时时间
                .cookieJar(new CookieManager());//设置cookie持久化*/

        OkHttpClient.Builder okHttpClient;
//        if (AppUtils.isLogin()) {
        if (UserManager.getInstance().isLogin() || tryLogin) {
            //这里需要判断是不是已经登录了，如果是已经登录了，那么带上cookie管理一起请求数据
            okHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(10, TimeUnit.SECONDS)//设置超时时间
                    .readTimeout(10, TimeUnit.SECONDS)//设置读取超时时间
                    .writeTimeout(10, TimeUnit.SECONDS)//设置写入超时时间
                    .cookieJar(new CookieManager());//设置cookie持久化
        } else {
            okHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(10, TimeUnit.SECONDS)//设置超时时间
                    .readTimeout(10, TimeUnit.SECONDS)//设置读取超时时间
                    .writeTimeout(10, TimeUnit.SECONDS);//设置写入超时时间
        }

        Retrofit retrofit = new Retrofit.Builder()
                .client(okHttpClient.build())
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        apiService = retrofit.create(ApiService.class);
    }

    public static void refresh() {
        apiService = null;
        tryLogin = true;
    }

    public static void noCookie() {
        apiService = null;
    }

    public static boolean tryLogin = false;
}
